home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / util / max / expflybsp / enum_scene.cpp next >
Encoding:
C/C++ Source or Header  |  2000-08-09  |  10.5 KB  |  465 lines

  1. #include "expflybsp.h"
  2. #include "../../../lib/Fly3D.h"
  3. #include "scene_max.h"
  4. #include "enum_scene.h"
  5. #include "stdmat.h"
  6. #include <stdio.h>
  7. #include "../flyfao/flyfao.h"
  8. #include "shape.h"
  9.  
  10. #define OBTYPE_MESH 0
  11. #define OBTYPE_CAMERA 1
  12. #define OBTYPE_OMNILIGHT 2
  13. #define OBTYPE_SPOTLIGHT 3
  14. #define OBTYPE_DUMMY 5
  15. #define OBTYPE_CTARGET 6
  16. #define OBTYPE_LTARGET 7
  17.  
  18. #define cc(a) ((a)>1.0f?1.0f:(a))
  19. extern int saveobj,savebsp;
  20. extern int lightradius;
  21. extern int tot_vert,tot_face;
  22.  
  23. void enum_scene::AddLight(GenLight* ob, Matrix3 mat3)
  24. {
  25.     Point3 colorVal = ob->GetRGBColor(0), pos;
  26.     float fac=(float)GetMasterScale(UNITS_CENTIMETERS)/10;
  27.  
  28.     if(nlights)
  29.     {
  30.         light_max *tmp=new light_max[nlights+1];
  31.         memcpy(tmp, lightlib, sizeof(light_max)*nlights);
  32.         delete lightlib;
  33.         lightlib=tmp;
  34.     }
  35.     else lightlib=new light_max;
  36.      
  37.     pos=mat3.GetRow(3);
  38.  
  39.     lightlib[nlights].type=0;
  40.     lightlib[nlights].pos.vec(pos.x*fac, pos.y*fac, pos.z*fac);
  41.     lightlib[nlights].color.vec(colorVal.x,colorVal.y,colorVal.z);
  42.     nlights++;
  43. }
  44.  
  45. int enum_scene::AddMtl(Mtl *m)
  46. {
  47.     Color c;
  48.     int i, k, l;
  49.     char m_name[128], m_name_base[128];
  50.     StdMat* std;
  51.  
  52.     if(!m) return 0;
  53.  
  54.     strcpy(m_name_base, m->GetName());
  55.     
  56.     strcpy(m_name, m_name_base);
  57.     if(m->ClassID()==Class_ID(MULTI_CLASS_ID,0))
  58.     {
  59.         strcat(m_name, m->GetSubMtl(0)->GetName());
  60.         l=m->NumSubMtls();
  61.     }
  62.     else
  63.         l=1;
  64.             
  65.     if((i=FindMtl(m_name))>0) return i;
  66.  
  67.     for(k=0; k<l; k++)
  68.     {
  69.         material *temp=new material[nmatlib+1];
  70.         memcpy(temp, matlib, nmatlib*sizeof(material));
  71.         delete matlib;
  72.         matlib=temp;
  73.  
  74.         strcpy(m_name, m_name_base);
  75.         
  76.         if(m->ClassID()==Class_ID(MULTI_CLASS_ID,0))
  77.         {
  78.             std = (StdMat *)m->GetSubMtl(k);
  79.             strcat(m_name, std->GetName());
  80.             matlib[nmatlib].l=l;
  81.         }
  82.         else
  83.         {
  84.             std = (StdMat *)m;
  85.             matlib[nmatlib].l=0;
  86.         }
  87.  
  88.         strcpy(matlib[nmatlib].name, m_name);
  89.  
  90.         c=std->GetAmbient(0);
  91.         matlib[nmatlib].ambient[0]=c.r;
  92.         matlib[nmatlib].ambient[1]=c.g;
  93.         matlib[nmatlib].ambient[2]=c.b;
  94.  
  95.         c=std->GetDiffuse(0);
  96.         matlib[nmatlib].diffuse[0]=c.r;
  97.         matlib[nmatlib].diffuse[1]=c.g;
  98.         matlib[nmatlib].diffuse[2]=c.b;
  99.  
  100.         matlib[nmatlib].transparency=std->GetXParency();
  101.         matlib[nmatlib].self_illum=std->GetSelfIllum(0);
  102.  
  103.         Texmap *tx;
  104.         tx=std->GetSubTexmap(ID_DI);
  105.         if(tx!=NULL && tx->ClassID()==Class_ID(BMTEX_CLASS_ID,0))
  106.         {
  107.             BitmapTex *bmt = (BitmapTex*)tx;
  108.             StdUVGen *uv = bmt->GetUVGen();
  109.             matlib[nmatlib].map_texture1.u_scale=uv->GetUScl(0);
  110.             matlib[nmatlib].map_texture1.v_scale=uv->GetVScl(0);
  111.             matlib[nmatlib].map_texture1.u_offset=uv->GetUOffs(0);
  112.             matlib[nmatlib].map_texture1.v_offset=uv->GetVOffs(0);
  113.             matlib[nmatlib].map_texture1.rotation=uv->GetAng(0);
  114.             strcpy(matlib[nmatlib].map_texture1.filename, bmt->GetMapName());
  115.             if (strrchr(matlib[nmatlib].map_texture1.filename,'/'))
  116.                 strcpy(matlib[nmatlib].map_texture1.filename,strrchr(matlib[nmatlib].map_texture1.filename,'/')+1);
  117.             else if (strrchr(matlib[nmatlib].map_texture1.filename,'\\'))
  118.                 strcpy(matlib[nmatlib].map_texture1.filename,strrchr(matlib[nmatlib].map_texture1.filename,'\\')+1);
  119.         }
  120.         nmatlib++;
  121.     }
  122.  
  123.     return nmatlib-k;
  124. }
  125.  
  126. int enum_scene::FindMtl(char *name)
  127. {
  128.     for(int i=1; i<nmatlib; i++)
  129.         if(stricmp(matlib[i].name, name)==0)
  130.             return i;
  131.  
  132.     return 0;
  133. }
  134.  
  135. void enum_scene::Save3DS(Mesh *m, char *name, int mat, Matrix3 tm,Point3 pos, Matrix3 piv)
  136. {
  137.     char filename[256];
  138.     float *v,*t,local_axis[12]={ 1,0,0, 0,1,0, 0,0,1, 0,0,0 };
  139.     unsigned short nv,*f,nf,*mf,nmf;
  140.     int a,i,j,k;
  141.     Point3 pt;
  142.  
  143.     pt.x=0; pt.y=0; pt.z=0;
  144.     pt=pt*Inverse(piv);
  145.     pt=pt*tm;
  146.     local_axis[9]=pt.x;
  147.     local_axis[10]=pt.y;
  148.     local_axis[11]=pt.z;    
  149.  
  150.     nf=m->numFaces;
  151.     nv=m->numVerts;
  152.     v=new float[nv*3];
  153.     f=new unsigned short[nf*3];
  154.     mf=new unsigned short[nf*3];
  155.     t=new float[nv*2];
  156.     for( a=0;a<nv;a++ )
  157.         {
  158.         pt=m->verts[a]*piv;
  159.         pt=pt*tm;
  160.         pt=pt-pos;
  161.  
  162.         v[a*3]   = pt.x;
  163.         v[a*3+1] = pt.y;
  164.         v[a*3+2] = pt.z;
  165.         }
  166.     for( a=0;a<nf;a++ )
  167.         for(i=0;i<3;i++)
  168.         {
  169.             f[a*3+i]=(unsigned short)m->faces[a].v[i];
  170.             if (m->tvFace)
  171.                 {
  172.                 t[f[a*3+i]*2]=m->tVerts[m->tvFace[a].t[i]].x;
  173.                 t[f[a*3+i]*2+1]=-m->tVerts[m->tvFace[a].t[i]].y;
  174.                 }
  175.             else 
  176.                 {
  177.                 t[f[a*3+i]*2]=
  178.                 t[f[a*3+i]*2+1]=0;
  179.                 }
  180.         }
  181.  
  182.     if(matlib[mat].l>0)
  183.         {
  184.         j=0;
  185.         for( i=0;i<matlib[mat].l;i++ )
  186.             {
  187.             mf[j++]=i;
  188.             k=j;
  189.             mf[j++]=0;
  190.             for( a=0;a<nf;a++ )
  191.                 if ((m->faces[a].getMatID()%matlib[mat].l)==i)
  192.                     mf[j++]=a;
  193.             mf[k]=j-k-1;
  194.             }
  195.         nmf=j;
  196.         }
  197.     else
  198.         {
  199.         mf[0]=0;
  200.         mf[1]=nf;
  201.         for( i=0;i<nf;i++ )
  202.             mf[2+i]=i;
  203.         nmf=nf+2;
  204.         }
  205.  
  206.     strcpy(filename,"objects/");
  207.     strcat(filename,name);
  208.     strcat(filename,".3ds");
  209.     export3ds e(filename,(float)GetMasterScale(UNITS_INCHES),&matlib[mat],matlib[mat].l==0?1:matlib[mat].l);
  210.  
  211.     e.WriteNamedObject(    name, v, t,    nv, f, nf, mf, nmf, &matlib[mat],local_axis);
  212.     e.close();
  213.  
  214.     delete v;
  215.     delete f;
  216.     delete mf;
  217.     delete t;
  218. }
  219.  
  220. void enum_scene::AddMesh(Mesh *m, char *name, int mat, Matrix3 mat3)
  221. {
  222.     Point3 pt;
  223.     Interval valid;
  224.     float fac=(float)GetMasterScale(UNITS_CENTIMETERS)/10;
  225.     int a, i;
  226.  
  227.     for( a=0;a<m->numVerts;a++ )
  228.     {
  229.         pt = m->verts[a] * mat3;
  230.         vert[a+nvert].vec(pt.x*fac, pt.y*fac, pt.z*fac);
  231.     }
  232.  
  233.     for( a=0;a<m->numFaces;a++ )
  234.     {
  235.         for(i=0;i<3;i++)
  236.         {
  237.             faces[a+nfaces].vert[i]=(vector *)(m->faces[a].v[i]+nvert);
  238.             if (m->tvFace)
  239.                 {
  240.                 faces[a+nfaces].uv[i][0]=m->tVerts[m->tvFace[a].t[i]].x;
  241.                 faces[a+nfaces].uv[i][1]=-m->tVerts[m->tvFace[a].t[i]].y;
  242.                 }
  243.             else 
  244.                 faces[a+nfaces].uv[i][0]=faces[a+nfaces].uv[i][1]=0;
  245.         }
  246.  
  247.         if(matlib[mat].l>0)
  248.             faces[a+nfaces].texpic=mat+(m->faces[a].getMatID()%matlib[mat].l);
  249.         else
  250.             faces[a+nfaces].texpic=mat;
  251.  
  252.         faces[a+nfaces].color=*((vector *)&matlib[faces[a+nfaces].texpic].diffuse);
  253.         faces[a+nfaces].color.w=1-matlib[faces[a+nfaces].texpic].transparency;
  254.         faces[a+nfaces].emmradius=lightradius*matlib[faces[a+nfaces].texpic].self_illum;
  255.     }
  256.  
  257.     if (m->vertCol)
  258.     {
  259.         if (vertcolor==0)
  260.         {
  261.             vertcolor=new vector[tot_vert];
  262.             for( i=0;i<tot_vert;i++ )
  263.                 vertcolor[i].vec(1,1,1);
  264.         }
  265.         for( i=0;i<m->numCVerts;i++ )
  266.         {
  267.             vertcolor[i+nvert].x=m->vertCol[i].x;
  268.             vertcolor[i+nvert].y=m->vertCol[i].y;
  269.             vertcolor[i+nvert].z=m->vertCol[i].z;
  270.         }
  271.     }
  272.  
  273.     nfaces+=m->numFaces;
  274.     nvert+=m->numVerts;    
  275. }
  276.  
  277. int enum_scene::callback(INode *node)
  278. {
  279.     Object *obj = node->EvalWorldState(time).obj;
  280.  
  281.     if(obj->ClassID()==Class_ID(SPLINE3D_CLASS_ID,0))
  282.     {
  283.         if (saveobj)
  284.         {
  285.         char *name=node->GetName();
  286.         char filename[256];
  287.         ShapeObject *s=(ShapeObject *)obj;
  288.         if (s->CanMakeBezier())
  289.             {
  290.             Matrix3 piv(1);
  291.             piv.PreTranslate(node->GetObjOffsetPos());
  292.             PreRotateMatrix(piv, node->GetObjOffsetRot());
  293.             ApplyScaling(piv, node->GetObjOffsetScale());
  294.             Matrix3 tm=node->GetObjectTM(time);
  295.             Point3 pos=tm.GetTrans();
  296.             float fac=(float)GetMasterScale(UNITS_CENTIMETERS)/10;
  297.  
  298.             BezierShape shape;
  299.             s->MakeBezier(time,shape);
  300.             strcpy(filename,"objects/");
  301.             strcat(filename,name);
  302.             strcat(filename,".bez");
  303.             int i,j;
  304.             Point3 p;
  305.             FILE *fp=fopen(filename,"wt");
  306.             if (fp)
  307.                 {
  308.                 p.x=0; p.y=0; p.z=0;
  309.                 p=((p*Inverse(piv))*tm)*fac;
  310.                 fprintf(fp,"%f %f %f\n\n",p.x,p.y,p.z);
  311.                 shape.splines[0]->ComputeBezPoints();
  312.                 j=shape.splines[0]->KnotCount();
  313.                 fprintf(fp,"3 %i\n\n",j*3-2);
  314.                 for( i=0;i<j;i++ )
  315.                     {
  316.                     if (i>0)
  317.                         {
  318.                         p=shape.splines[0]->GetVert(i*3);
  319.                         p=((p*piv)*tm-pos)*fac;
  320.                         fprintf(fp,"\t%f\t%f\t%f\n",p.x,p.y,p.z);
  321.                         }
  322.                     p=shape.splines[0]->GetVert(i*3+1);
  323.                     p=((p*piv)*tm-pos)*fac;
  324.                     fprintf(fp,"\t%f\t%f\t%f\n",p.x,p.y,p.z);
  325.                     if (i<j-1)
  326.                         {
  327.                         p=shape.splines[0]->GetVert(i*3+2);
  328.                         p=((p*piv)*tm-pos)*fac;
  329.                         fprintf(fp,"\t%f\t%f\t%f\n",p.x,p.y,p.z);
  330.                         }
  331.                     }
  332.                 fclose(fp);
  333.                 }
  334.             }
  335.         }
  336.     }
  337.     else
  338.     if (obj->CanConvertToType(FLYFAO_CLASS_ID))
  339.     {
  340.         if (saveobj)
  341.         {
  342.         Flyfao *ff=(Flyfao *)obj;
  343.         char *name=node->GetName();
  344.         char filename[256];
  345.         char skin[256]="";
  346.         strcpy(filename,"objects/");
  347.         strcat(filename,name);
  348.         strcat(filename,".fao");
  349.  
  350.         Matrix3 piv(1);
  351.         piv.PreTranslate(node->GetObjOffsetPos());
  352.         PreRotateMatrix(piv, node->GetObjOffsetRot());
  353.         ApplyScaling(piv, node->GetObjOffsetScale());
  354.         Matrix3 tm=node->GetObjectTM(time);
  355.         Point3 pos=tm.GetTrans();
  356. /*
  357.         int i,j=ff->nverts*ff->nkeys;
  358.         float *tmp=new float[j*3],*t;
  359.         Point3 *p1=(Point3 *)tmp,p2;
  360.         memcpy(tmp,ff->verts,sizeof(float)*j*3);
  361.         for( i=0;i<j;i++,p1++ )
  362.             {
  363.             p2=*p1*piv;
  364.             p2=p2*tm;
  365.             p2=p2-pos;
  366.             *p1=p2;
  367.             }
  368.         t=ff->verts;
  369.         ff->verts=tmp;
  370. */
  371.         Mtl *m=node->GetMtl();
  372.         if(m && m->ClassID()==Class_ID(DMTL_CLASS_ID,0))
  373.             {
  374.             StdMat *std=(StdMat *)m;
  375.             Texmap *tx=std->GetSubTexmap(ID_DI);
  376.             if(tx!=NULL && tx->ClassID()==Class_ID(BMTEX_CLASS_ID,0))
  377.                 {
  378.                 BitmapTex *bmt=(BitmapTex*)tx;
  379.                 char str[256];
  380.                 strcpy(str,bmt->GetMapName());
  381.                 if (strrchr(str,'\\'))
  382.                     strcpy(skin,strrchr(str,'\\')+1);
  383.                 else if (strrchr(str,'/'))
  384.                     strcpy(skin,strrchr(str,'/')+1);
  385.                 else strcpy(skin,str);
  386.                 }
  387.             }
  388.         ff->save_fao(filename,skin,pos);
  389. /*        
  390.         ff->verts=t;
  391.         delete tmp;
  392. */        }
  393.     }
  394.     else
  395.     if(obj->CanConvertToType(triObjectClassID))
  396.     {
  397.         char *name=node->GetName();
  398.         if (name[0]=='#')
  399.         {
  400.             if (saveobj)
  401.             {
  402.             Matrix3 piv(1);
  403.             piv.PreTranslate(node->GetObjOffsetPos());
  404.             PreRotateMatrix(piv, node->GetObjOffsetRot());
  405.             ApplyScaling(piv, node->GetObjOffsetScale());
  406.  
  407.             Matrix3 tm=node->GetObjectTM(time);
  408.             Point3 pos=tm.GetTrans();
  409.  
  410.             Save3DS(&((TriObject *)obj->ConvertToType(time, triObjectClassID))->mesh,
  411.                 &name[1],
  412.                 AddMtl(node->GetMtl()),
  413.                 tm,pos,piv);
  414.             }
  415.         }
  416.         else if (savebsp)
  417.         {
  418.             TriObject *obj3=(TriObject *)obj->ConvertToType(time, triObjectClassID);
  419.             if (obj3)
  420.             AddMesh(
  421.                 &obj3->mesh,
  422.                 name,
  423.                 AddMtl(node->GetMtl()),
  424.                 node->GetNodeTM(time));
  425.         }
  426.  
  427.         return TREE_CONTINUE;
  428.     }
  429.     
  430.     if(!node->IsTarget())
  431.     {
  432.         switch(obj->SuperClassID())
  433.         { 
  434.         case LIGHT_CLASS_ID:
  435.             if(obj->ClassID()==Class_ID(OMNI_LIGHT_CLASS_ID,0))
  436.                 AddLight(
  437.                     (GenLight *)obj,
  438.                     node->GetNodeTM(0));
  439.             break;
  440.         }
  441.     }
  442.     return TREE_CONTINUE;
  443. }
  444.  
  445. int enum_scene_count::callback(INode *node)
  446. {
  447.     Object *obj = node->EvalWorldState(time).obj;
  448.  
  449.     if(obj->CanConvertToType(triObjectClassID))
  450.     {
  451.         char *name=node->GetName();
  452.         if (name[0]!='#')
  453.         {
  454.             TriObject *obj3=(TriObject *)obj->ConvertToType(time, triObjectClassID);
  455.             if (obj3)
  456.             {
  457.                 tot_vert+=obj3->mesh.numVerts;
  458.                 tot_face+=obj3->mesh.numFaces;
  459.             }
  460.         }
  461.     }
  462.     
  463.     return TREE_CONTINUE;
  464. }
  465.